Операторы и конструкции С#
В данном разделе рассматриваются операторы, применяемые при построении
различных программных конструкций.
Основным оператором присваивания является оператор =. Формальное описание
данного оператора имеет вид:
<идентификатор> = <значение>;
<идентификатор> должен быть такого типа данных, который может вместить в
себя присваиваемое значение, или который знает, как обработать присваиваемое значение.
<значение> может быть числовой константой, переменной или результатом
вычисления выражения.
Если требуется изменить значение некоторой переменной с учётом её предыдущего
значения, то могут быть использованы операторы присваивания +=,
–=, *=, /=, %=, &=, |=, ^=, <<=, >>=. Данные операторы выполняют указанную перед
символом = операцию между операндами, расположенными слева и справа от него, и
записывают результат в операнд, указанный слева. Например, выражение a *= b +
с; равносильно выражению a = a*(b + с);
Приведение типов
При выполнении операторов присваивания (а также других операторов) в некоторых
случаях может выполняться приведение (преобразование) типов, например, во фрагменте
программы
int a=5; double d=a;
во второй строке выполняется неявное (автоматическое) преобразование целого значения
в вещественное. Автоматическое преобразование возможно, если:
оба типа совместимы;
диапазон представления чисел целевого типа шире, чем у исходного типа.
Если требуется выполнить явное преобразование значения переменной или
выражения к некоторому типу, то используется конструкция:
(<тип данных>)<преобразуемая величина>
Естественно, что возможность явного преобразования зависит от типа данных и
преобразуемой величины.
Следует учитывать, что при выполнении выражений также производится
преобразование типов в следующем порядке (т.е. сначала делается первая проверка, при
её невыполнении вторая и т.д.):
ЕСЛИ один операнд имеет тип decimal, TO и второй продвигается к типу decimal (но
если второй операнд имеет тип float или double, результат будет ошибочным);
ЕСЛИ один операнд имеет тип double, TO и второй продвигается к типу double;
ЕСЛИ один операнд имеет тип float, TO и второй продвигается к типу float;
ЕСЛИ один операнд имеет тип ulong, TO и второй продвигается к типу ulong (но если
второй операнд имеет тип sbyte, short, int или long, результат будет ошибочным);
ЕСЛИ один операнд имеет тип long, TO и второй продвигается к типу long;
ЕСЛИ один операнд имеет тип uint, а второй имеет тип sbyte, short или int, ТО оба
операнда продвигаются к типу long;
ЕСЛИ один операнд имеет тип uint, TO и второй продвигается к типу uint;